{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### 采用5折交叉验证，分别用log似然损失和正确率，对Logistic回归模型的正则超参数调优。（各50分）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n0   0.639947                      0.848324        0.149641   \n1  -0.844885                     -1.123396       -0.160546   \n2   1.233880                      1.943724       -0.263941   \n3  -0.844885                     -0.998208       -0.160546   \n4  -1.141852                      0.504055       -1.504687   \n\n   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n0                     0.907270      -0.692891  0.204013   \n1                     0.530902      -0.692891 -0.684422   \n2                    -1.288212      -0.692891 -1.103255   \n3                     0.154533       0.123302 -0.494043   \n4                     0.907270       0.765836  1.409746   \n\n   Diabetes_pedigree_function       Age  Target  \n0                    0.468492  1.425995       1  \n1                   -0.365061 -0.190672       0  \n2                    0.604397 -0.105584       1  \n3                   -0.920763 -1.041549       0  \n4                    5.484909 -0.020496       1  \n<class 'pandas.core.frame.DataFrame'>\nRangeIndex: 768 entries, 0 to 767\nData columns (total 9 columns):\npregnants                       768 non-null float64\nPlasma_glucose_concentration    768 non-null float64\nblood_pressure                  768 non-null float64\nTriceps_skin_fold_thickness     768 non-null float64\nserum_insulin                   768 non-null float64\nBMI                             768 non-null float64\nDiabetes_pedigree_function      768 non-null float64\nAge                             768 non-null float64\nTarget                          768 non-null int64\ndtypes: float64(8), int64(1)\nmemory usage: 54.0 KB\nNone\n          pregnants  Plasma_glucose_concentration  blood_pressure  \\\ncount  7.680000e+02                  7.680000e+02    7.680000e+02   \nmean  -5.551115e-17                 -1.619075e-17    6.938894e-18   \nstd    1.000652e+00                  1.000652e+00    1.000652e+00   \nmin   -1.141852e+00                 -3.783654e+00   -3.572597e+00   \n25%   -8.448851e-01                 -6.852363e-01   -3.673367e-01   \n50%   -2.509521e-01                 -1.218877e-01    1.496408e-01   \n75%    6.399473e-01                  6.057709e-01    5.632228e-01   \nmax    3.906578e+00                  2.444478e+00    2.734528e+00   \n\n       Triceps_skin_fold_thickness  serum_insulin           BMI  \\\ncount                 7.680000e+02   7.680000e+02  7.680000e+02   \nmean                  1.006140e-16  -2.775558e-17  2.798687e-16   \nstd                   1.000652e+00   1.000652e+00  1.000652e+00   \nmin                  -1.288212e+00  -6.928906e-01 -4.060474e+00   \n25%                  -1.288212e+00  -6.928906e-01 -5.955785e-01   \n50%                   1.545332e-01  -4.280622e-01  9.419788e-04   \n75%                   7.190857e-01   4.120079e-01  5.847705e-01   \nmax                   4.921866e+00   6.652839e+00  4.455807e+00   \n\n       Diabetes_pedigree_function           Age      Target  \ncount                7.680000e+02  7.680000e+02  768.000000  \nmean                 2.498002e-16  1.815677e-16    0.348958  \nstd                  1.000652e+00  1.000652e+00    0.476951  \nmin                 -1.189553e+00 -1.041549e+00    0.000000  \n25%                 -6.889685e-01 -7.862862e-01    0.000000  \n50%                 -3.001282e-01 -3.608474e-01    0.000000  \n75%                  4.662269e-01  6.602056e-01    1.000000  \nmax                  5.883565e+00  4.063716e+00    1.000000  \n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "# 读取特征工程后的数据\n",
    "train = pd.read_csv(\"data/pima_indians_diabetes/FE_pima-indians-diabetes.csv\")\n",
    "print(train.head())\n",
    "print(train.info())\n",
    "print(train.describe())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "# import sklearn\n",
    "# print(sorted(sklearn.metrics.SCORERS.keys()))\n",
    "\n",
    "# 获得特征和标签\n",
    "y_train = train[\"Target\"]\n",
    "X_train = train.drop([\"Target\"], axis=1)\n",
    "\n",
    "lr = LogisticRegression(solver=\"liblinear\")\n",
    "penalty_list = [\"l1\", \"l2\"]\n",
    "C_list = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty=penalty_list, C=C_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "用log似然损失进行超参数调优，得到的结果为: \n\tbest_score:0.4820287373783356, \n\tbest_params:{'C': 1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "# 用log似然损失来进行超参数调优\n",
    "grid = GridSearchCV(lr, tuned_parameters, cv=5, scoring=\"neg_log_loss\", return_train_score=True)\n",
    "grid.fit(X_train, y_train)\n",
    "\n",
    "best_score = -grid.best_score_\n",
    "best_params = grid.best_params_\n",
    "\n",
    "print(\"用log似然损失进行超参数调优，得到的结果为: \\n\\tbest_score:{}, \\n\\tbest_params:{}\"\n",
    "      .format(best_score, best_params))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出CV曲线\n",
    "test_means = grid.cv_results_[\"mean_test_score\"]\n",
    "test_stds = grid.cv_results_[\"std_test_score\"]\n",
    "train_means = grid.cv_results_[\"mean_train_score\"]\n",
    "train_stds = grid.cv_results_[\"std_train_score\"]\n",
    "\n",
    "C_list_size = len(C_list)\n",
    "penalty_list_size = len(penalty_list)\n",
    "test_means_array = np.array(test_means).reshape(C_list_size, penalty_list_size)\n",
    "train_means_array = np.array(train_means).reshape(C_list_size, penalty_list_size)\n",
    "test_stds_array = np.array(test_stds).reshape(C_list_size, penalty_list_size)\n",
    "train_stds_array = np.array(train_stds).reshape(C_list_size, penalty_list_size)\n",
    "\n",
    "x_axis = np.log10(C_list)\n",
    "for i, value in enumerate(penalty_list):\n",
    "    label_test = \"{} Test\".format(value)\n",
    "    label_train = \"{} Train\".format(value)\n",
    "    plt.errorbar(x_axis, -test_means_array[:, i], yerr=test_stds_array[:, i], label=label_test)\n",
    "    plt.errorbar(x_axis, -train_means_array[:, i], yerr=train_stds_array[:, i], label=label_train)\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel(\"log(C)\")\n",
    "plt.ylabel(\"logloss\")\n",
    "plt.savefig(\"logistic_grid_search_CV_C.png\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "用正确率进行超参数调优，得到的结果为：\n\tbest_score:0.7708333333333334, \n\tbest_params:{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "# 用正确率来进行超参数调优\n",
    "grid = GridSearchCV(lr, tuned_parameters, cv=5, scoring=\"accuracy\", return_train_score=True)\n",
    "grid.fit(X_train, y_train)\n",
    "\n",
    "best_score = grid.best_score_\n",
    "best_params = grid.best_params_\n",
    "print(\"用正确率进行超参数调优，得到的结果为：\\n\\tbest_score:{}, \\n\\tbest_params:{}\"\n",
    "      .format(best_score, best_params))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出CV曲线\n",
    "test_means = grid.cv_results_[\"mean_test_score\"]\n",
    "test_stds = grid.cv_results_[\"std_test_score\"]\n",
    "train_means = grid.cv_results_[\"mean_train_score\"]\n",
    "train_stds = grid.cv_results_[\"std_train_score\"]\n",
    "\n",
    "C_list_size = len(C_list)\n",
    "penalty_list_size = len(penalty_list)\n",
    "test_means_array = np.array(test_means).reshape(C_list_size, penalty_list_size)\n",
    "train_means_array = np.array(train_means).reshape(C_list_size, penalty_list_size)\n",
    "test_stds_array = np.array(test_stds).reshape(C_list_size, penalty_list_size)\n",
    "train_stds_array = np.array(train_stds).reshape(C_list_size, penalty_list_size)\n",
    "\n",
    "x_axis = np.log10(C_list)\n",
    "for i, value in enumerate(penalty_list):\n",
    "    label_test = \"{} Test\".format(value)\n",
    "    label_train = \"{} Train\".format(value)\n",
    "    plt.errorbar(x_axis, test_means_array[:, i], yerr=test_stds_array[:, i], label=label_test)\n",
    "    plt.errorbar(x_axis, train_means_array[:, i], yerr=train_stds_array[:, i], label=label_train)\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel(\"log(C)\")\n",
    "plt.ylabel(\"accuracy\")\n",
    "plt.savefig(\"logistic_grid_search_CV_C_accuracy.png\")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
